package com.sky.rabbit.consumer.direct;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
public class RabbitDirectReceiver {

    @RabbitHandler
    @RabbitListener(queues = "sky")
    public void process(Message message, Channel channel) throws IOException {
        System.out.println("接受消息为：" + new String(message.getBody(), "utf-8"));
        // 手动确认消息消费成功， 当配置文件开启手动确认之后，必须要加上下面的代码，否则消息会一直在队列中
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        // 如果当业务处理出现异常的情况，我们可以手动确认消息消费失败
        // 第一个参数为消息的index
        // 第二个参数是否批量. true：将一次性拒绝所有小于deliveryTag的消息。
        // 最后一个参数表示消息是否重新回队列，如果是true则返回，false不返回
        channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
    }

    @RabbitHandler
    @RabbitListener(queues = {"hct"})
    public void hctProcess(Message message, Channel channel) throws IOException {
        System.out.println("接受消息为：" + new String(message.getBody(), "UTF-8"));
    }

    @RabbitHandler
    @RabbitListener(queues = {"topic.sky"})
    public void topicProcess(String message){
        System.out.println("接受消息为：" + message);
    }

    @RabbitListener(queues = {"name"})
    public void nameProcess(String message){
        System.out.println("接收消息为：" + message);
    }

    @RabbitHandler
    @RabbitListener(queues = {"sky.topic"})
    public void directProcess(String message){
        System.out.println("接受消息为：" + message);
    }
    @RabbitHandler
    @RabbitListener(queues = {"direct.sky"})
    public void directProcessSky(String message){
        System.out.println("接受消息为：" + message);
    }
}
